﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModel.h"
#include "GcmpApiDeclaration.h"

namespace gcmp 
{ 
    class IDocument;
    class IElement;
    class IElementJoin;
    class ElementId;
    enum class JoinPosition;

    /// \brief 连接相关的Utility函数集合
    class GCMP_MODEL_EXPORT ElementJoinUtils
    {
    public:
        /// \brief 删除对象上的所有连接对象，清除对象上的所有连接关系
        /// \param pDocument 文档指针
        /// \param elementId 对象的ElementId
        /// \return void
        static void DeleteAllElementJoins(IDocument* pDocument, const ElementId &elementId);

        /// \brief 删除给定连接点位置的连接对象
        ///
        /// 如拖动夹点时，另一端保持连接关系不变
        /// \param pDocument 文档指针
        /// \param pElement 对象指针
        /// \param joinPosition 连接位置
        /// \return void
        static void DeleteJoinsByJoinPosition(IElement* pElement, JoinPosition joinPosition);

        /// \brief 根据连接点位置，判断对象在此处是否有连接关系
        /// \param pElement 对象指针
        /// \param joinPosition 连接位置
        /// \return 返回true表示有连接关系，否则表示无连接关系
        static bool HasElementJoinByJoinPosition(const IElement* pElement, JoinPosition joinPosition);

        /// \brief 判断两个对象间是否存在连接关系
        /// \param pDocument 当前文档
        /// \param elementId1 对象1
        /// \param elementId2 对象2
        /// \return true：存在连接关系，false：不存在连接关系
        static bool HasElementJoin(const IDocument* pDocument, const ElementId &elementId1, const ElementId &elementId2);
        
        /// \brief 根据连接点位置，得到连接对象指针数组
        /// \param pDocument 文档指针
        /// \param elementId 对象Id
        /// \param joinPosition 连接位置，可输入JoinPosition::Start或者JoinPosition::End值或者JoinPosition::Middle值
        /// \return 连接对象指针数组
        static std::vector<gcmp::IElementJoin*> GetElementJoinByJoinPosition(const IDocument* pDocument, const ElementId &elementId, JoinPosition joinPosition);
    };
}// namespace gcmp

